﻿#pragma once

#include <occmesh/frame/MainWindow.h>

#include <QWidget>

// 渲染头文件
#include <Prs3d_LineAspect.hxx>
#include <Prs3d_ShadingAspect.hxx>

// 图形交互
#include <AIS_InteractiveContext.hxx>
#include <MeshVS_MeshEntityOwner.hxx>
#include <OpenGL_GraphicDriver.hxx>
#include <Prs3d_PointAspect.hxx>
#include <StdSelect_BRepOwner.hxx>
#include <V3d_Viewer.hxx>

// 视口和窗口
#include <V3d_View.hxx>
#include <WNT_Window.hxx>

// 光照头文件
#include <V3d_AmbientLight.hxx>
#include <V3d_DirectionalLight.hxx>

// 交互头文件
#include <AIS_PointCloud.hxx>
#include <AIS_Shape.hxx>
#include <AIS_Triangulation.hxx>

// 形状头文件
#include <TopExp_Explorer.hxx>
#include <TopoDS.hxx>
#include <TopoDS_Compound.hxx>
#include <TopoDS_Edge.hxx>
#include <TopoDS_Face.hxx>
#include <TopoDS_Shape.hxx>
#include <TopoDS_Wire.hxx>

// 序列头文件
#include <Graphic3d_ArrayOfTriangleStrips.hxx>
#include <TColGeom_HArray1OfCurve.hxx>
#include <TColGeom_HArray1OfSurface.hxx>
#include <TColStd_HSequenceOfTransient.hxx>
#include <TColgp_HArray1OfPnt.hxx>
#include <TColgp_HSequenceOfPnt.hxx>
#include <TopTools_HSequenceOfShape.hxx>

// 构造器头文件
#include <BRepBuilderAPI_MakeEdge.hxx>
#include <BRepBuilderAPI_MakeFace.hxx>
#include <BRepBuilderAPI_MakeVertex.hxx>
#include <BRepBuilderAPI_MakeWire.hxx>

// 几何头文件
#include <Geom_BSplineCurve.hxx>
#include <Geom_BSplineSurface.hxx>
#include <Geom_Plane.hxx>
#include <gp_Circ.hxx>
#include <gp_Pnt.hxx>

// 用来获得几何信息
#include <BRep_Tool.hxx>

// 纹理信息
#include <Graphic3d_Texture2D.hxx>
#include <Graphic3d_TypeOfTexture.hxx>
#include <Image_PixMap.hxx>

// 读写头文件
#include <BRepTools.hxx>
#include <BRep_Builder.hxx>
#include <IGESControl_Reader.hxx>
#include <IGESControl_Writer.hxx>
#include <STEPControl_Reader.hxx>
#include <STEPControl_Writer.hxx>

// 坐标指示器
#include <AIS_Trihedron.hxx>
#include <Aspect_DisplayConnection.hxx>
#include <Font_FontMgr.hxx>
#include <Geom_Axis2Placement.hxx>
#include <Graphic3d_ArrayOfSegments.hxx>
#include <OSD_Environment.hxx>
#include <Prs3d_ArrowAspect.hxx>
#include <Prs3d_LineAspect.hxx>

#include <occmesh/mesh/ais_mesh.h>
#include <occmesh/mesh/mesh.h>
#include <occmesh/mesh/mesh_data.h>

namespace Ui
{
class OCCWidget;
}

class OCCWidget : public QWidget
{
    Q_OBJECT

  public:
    enum class ShadeMode
    {
        Smooth,
        Flat
    };

    enum class Action3d
    {
        Nothing,
        Panning, // 平移
        Zooming, // 缩放
        Rotation // 旋转
    };

    explicit OCCWidget(QWidget *parent);
    ~OCCWidget();

    void InitializeWindow();                                                   // 初始化窗口
    void UpdateInteractiveContext();                                           // 刷新上下文数据
    void AdjustSelectionStyle(const Handle(AIS_InteractiveContext) & context); // 修改选择风格
    void FitAllShapes();                                                       // 适应窗口
    void SetShadeMode(ShadeMode mode);                                         // 设置着色模式
    void DrawTriangulation(Handle(Poly_Triangulation) triangle);               // 绘制曲面
    void UpdateSelectedNodes();                                                // 更新选中的节点
    void UpdateBoundaryNodes();                                                // 更新边界节点
    std::vector<std::vector<int>> CornerNodes();                               // 获得角点索引
    std::vector<std::vector<int>> BoundaryNodes();                             // 获得边界点索引
    void ClearAll();                                                           // 清空节点

    std::vector<TopoDS_Shape> SelectedShapes();    // 获得被选中的形状
    std::vector<TopoDS_Edge> SelectedEdges();      // 获得被选中的边
    std::vector<TopoDS_Vertex> SelectedVertices(); // 获得被选中的点
    Handle(AIS_PointCloud) SelectedCloud();        // 获得被选中的点云
    MeshPtr SelectedMesh();                        // 获得被选中的网格

    virtual void resizeEvent(QResizeEvent *event);
    virtual void paintEvent(QPaintEvent *);
    virtual void mousePressEvent(QMouseEvent *);   // 按下
    virtual void mouseReleaseEvent(QMouseEvent *); // 抬起
    virtual void mouseMoveEvent(QMouseEvent *);    // 移动
    virtual void wheelEvent(QWheelEvent *);        // 滚轮
    virtual QPaintEngine *paintEngine() const;

  private:
    Ui::OCCWidget *ui;

    Action3d m_mode;       // 记录操作模式
    ShadeMode m_shadeMode; // 记录网格渲染模式
    QPoint m_pos;          // 记录鼠标平移坐标

    Handle(V3d_View) m_hView;                     // 视口句柄
    Handle(V3d_Viewer) m_hViewer;                 // 定义 V3d_Viewer 句柄
    Handle(AIS_InteractiveContext) m_hAisContext; // 定义交互上下文
    Handle(AIS_Trihedron) m_trihedron;            // 坐标轴指示器
    Handle(Graphic3d_Structure) m_structure;      // 定义图形结构

    std::vector<std::vector<int>> m_cornerNodes;   // 顶点索引
    std::vector<std::vector<int>> m_boundaryNodes; // 边界索引
    std::vector<TopoDS_Edge> m_selectedEdges;      // 被选中的曲线
    std::vector<TopoDS_Vertex> m_selectedVertices; // 被选中的点

    MainWindow *m_parent; // 保存父窗口
};